{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.contrib.learn.python.learn.estimators.estimator import SKCompat\n",
    "from tensorflow.python.ops import array_ops as array_ops_\n",
    "import matplotlib.pyplot as plt\n",
    "learn = tf.contrib.learn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. 设置神经网络的参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "HIDDEN_SIZE = 30\n",
    "NUM_LAYERS = 2\n",
    "\n",
    "TIMESTEPS = 10\n",
    "TRAINING_STEPS = 3000\n",
    "BATCH_SIZE = 32\n",
    "\n",
    "TRAINING_EXAMPLES = 10000\n",
    "TESTING_EXAMPLES = 1000\n",
    "SAMPLE_GAP = 0.01"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2. 定义生成正弦数据的函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def generate_data(seq):\n",
    "    X = []\n",
    "    y = []\n",
    "\n",
    "    for i in range(len(seq) - TIMESTEPS - 1):\n",
    "        X.append([seq[i: i + TIMESTEPS]])\n",
    "        y.append([seq[i + TIMESTEPS]])\n",
    "    return np.array(X, dtype=np.float32), np.array(y, dtype=np.float32)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3. 定义lstm模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def lstm_model(X, y):\n",
    "    lstm_cell = tf.contrib.rnn.BasicLSTMCell(HIDDEN_SIZE, state_is_tuple=True)\n",
    "    cell = tf.contrib.rnn.MultiRNNCell([lstm_cell] * NUM_LAYERS)\n",
    "    \n",
    "    output, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)\n",
    "    output = tf.reshape(output, [-1, HIDDEN_SIZE])\n",
    "    \n",
    "    # 通过无激活函数的全联接层计算线性回归，并将数据压缩成一维数组的结构。\n",
    "    predictions = tf.contrib.layers.fully_connected(output, 1, None)\n",
    "    \n",
    "    # 将predictions和labels调整统一的shape\n",
    "    labels = tf.reshape(y, [-1])\n",
    "    predictions=tf.reshape(predictions, [-1])\n",
    "    \n",
    "    loss = tf.losses.mean_squared_error(predictions, labels)\n",
    "    \n",
    "    train_op = tf.contrib.layers.optimize_loss(\n",
    "        loss, tf.contrib.framework.get_global_step(),\n",
    "        optimizer=\"Adagrad\", learning_rate=0.1)\n",
    "\n",
    "    return predictions, loss, train_op"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4. 进行训练。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Using default config.\n",
      "INFO:tensorflow:Using config: {'_save_checkpoints_secs': 600, '_num_ps_replicas': 0, '_keep_checkpoint_max': 5, '_tf_random_seed': None, '_task_type': None, '_environment': 'local', '_is_chief': True, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x11a5590d0>, '_tf_config': gpu_options {\n",
      "  per_process_gpu_memory_fraction: 1\n",
      "}\n",
      ", '_task_id': 0, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_evaluation_master': '', '_keep_checkpoint_every_n_hours': 10000, '_master': ''}\n",
      "INFO:tensorflow:Create CheckpointSaverHook.\n",
      "INFO:tensorflow:Saving checkpoints for 1 into Models/model_2/model.ckpt.\n",
      "INFO:tensorflow:loss = 0.491647, step = 1\n",
      "INFO:tensorflow:global_step/sec: 188.742\n",
      "INFO:tensorflow:loss = 0.00536189, step = 101\n",
      "INFO:tensorflow:global_step/sec: 232.293\n",
      "INFO:tensorflow:loss = 0.00523746, step = 201\n",
      "INFO:tensorflow:global_step/sec: 222.852\n",
      "INFO:tensorflow:loss = 0.00308377, step = 301\n",
      "INFO:tensorflow:global_step/sec: 221.96\n",
      "INFO:tensorflow:loss = 0.00336958, step = 401\n",
      "INFO:tensorflow:global_step/sec: 214.658\n",
      "INFO:tensorflow:loss = 0.00279854, step = 501\n",
      "INFO:tensorflow:global_step/sec: 198.507\n",
      "INFO:tensorflow:loss = 0.00239536, step = 601\n",
      "INFO:tensorflow:global_step/sec: 235.11\n",
      "INFO:tensorflow:loss = 0.00155067, step = 701\n",
      "INFO:tensorflow:global_step/sec: 234.653\n",
      "INFO:tensorflow:loss = 0.00157833, step = 801\n",
      "INFO:tensorflow:global_step/sec: 204.6\n",
      "INFO:tensorflow:loss = 0.00120256, step = 901\n",
      "INFO:tensorflow:global_step/sec: 205.953\n",
      "INFO:tensorflow:loss = 0.000943568, step = 1001\n",
      "INFO:tensorflow:global_step/sec: 220.453\n",
      "INFO:tensorflow:loss = 0.000876339, step = 1101\n",
      "INFO:tensorflow:global_step/sec: 221.479\n",
      "INFO:tensorflow:loss = 0.000911509, step = 1201\n",
      "INFO:tensorflow:global_step/sec: 196.529\n",
      "INFO:tensorflow:loss = 0.000629159, step = 1301\n",
      "INFO:tensorflow:global_step/sec: 212.558\n",
      "INFO:tensorflow:loss = 0.000686743, step = 1401\n",
      "INFO:tensorflow:global_step/sec: 212.959\n",
      "INFO:tensorflow:loss = 0.000698992, step = 1501\n",
      "INFO:tensorflow:global_step/sec: 224.379\n",
      "INFO:tensorflow:loss = 0.000569221, step = 1601\n",
      "INFO:tensorflow:global_step/sec: 206.306\n",
      "INFO:tensorflow:loss = 0.000498735, step = 1701\n",
      "INFO:tensorflow:global_step/sec: 224.091\n",
      "INFO:tensorflow:loss = 0.000503566, step = 1801\n",
      "INFO:tensorflow:global_step/sec: 176.59\n",
      "INFO:tensorflow:loss = 0.000373, step = 1901\n",
      "INFO:tensorflow:global_step/sec: 220.858\n",
      "INFO:tensorflow:loss = 0.000287493, step = 2001\n",
      "INFO:tensorflow:global_step/sec: 195.514\n",
      "INFO:tensorflow:loss = 0.000209309, step = 2101\n",
      "INFO:tensorflow:global_step/sec: 224.015\n",
      "INFO:tensorflow:loss = 0.000323008, step = 2201\n",
      "INFO:tensorflow:global_step/sec: 195.972\n",
      "INFO:tensorflow:loss = 0.00015437, step = 2301\n",
      "INFO:tensorflow:global_step/sec: 219.664\n",
      "INFO:tensorflow:loss = 0.000121245, step = 2401\n",
      "INFO:tensorflow:global_step/sec: 216.561\n",
      "INFO:tensorflow:loss = 0.000165566, step = 2501\n",
      "INFO:tensorflow:global_step/sec: 233.534\n",
      "INFO:tensorflow:loss = 0.000130429, step = 2601\n",
      "INFO:tensorflow:global_step/sec: 230.028\n",
      "INFO:tensorflow:loss = 0.000143373, step = 2701\n",
      "INFO:tensorflow:global_step/sec: 236.298\n",
      "INFO:tensorflow:loss = 0.000118591, step = 2801\n",
      "INFO:tensorflow:global_step/sec: 202.394\n",
      "INFO:tensorflow:loss = 6.92828e-05, step = 2901\n",
      "INFO:tensorflow:Saving checkpoints for 3000 into Models/model_2/model.ckpt.\n",
      "INFO:tensorflow:Loss for final step: 8.82684e-05.\n",
      "Mean Square Error is: 0.009076\n"
     ]
    }
   ],
   "source": [
    "# 封装之前定义的lstm。\n",
    "regressor = SKCompat(learn.Estimator(model_fn=lstm_model,model_dir=\"Models/model_2\"))\n",
    "\n",
    "# 生成数据。\n",
    "test_start = TRAINING_EXAMPLES * SAMPLE_GAP\n",
    "test_end = (TRAINING_EXAMPLES + TESTING_EXAMPLES) * SAMPLE_GAP\n",
    "train_X, train_y = generate_data(np.sin(np.linspace(\n",
    "    0, test_start, TRAINING_EXAMPLES, dtype=np.float32)))\n",
    "test_X, test_y = generate_data(np.sin(np.linspace(\n",
    "    test_start, test_end, TESTING_EXAMPLES, dtype=np.float32)))\n",
    "\n",
    "# 拟合数据。\n",
    "regressor.fit(train_X, train_y, batch_size=BATCH_SIZE, steps=TRAINING_STEPS)\n",
    "\n",
    "# 计算预测值。\n",
    "predicted = [[pred] for pred in regressor.predict(test_X)]\n",
    "\n",
    "# 计算MSE。\n",
    "rmse = np.sqrt(((predicted - test_y) ** 2).mean(axis=0))\n",
    "print (\"Mean Square Error is: %f\" % rmse[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5. 画出预测值和真实值的曲线。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11a5600d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_predicted, = plt.plot(predicted, label='predicted')\n",
    "plot_test, = plt.plot(test_y, label='real_sin')\n",
    "plt.legend([plot_predicted, plot_test],['predicted', 'real_sin'])\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
